/**
 * 递归查找并收集节点的所有上游节点
 * @param {Object} startNode - 起始节点
 * @returns {Array} 包含所有上游节点的数组（去重后）
 */
function collectUpstreamNodes(startNode,graph) {
  // 存储所有上游节点的数组
  const upstreamNodes = [];
  
  /**
   * 递归查找上游节点
   * @param {Object} currentNode - 当前处理的节点
   */
  function findUpstream(currentNode) {
    // 查找指向当前节点的所有边
    const incomingEdges = graph.edges.filter(
      edge => edge.targetNodeId === currentNode.id
    );
    
    // 如果没有入边，说明是起始节点，终止递归
    if (incomingEdges.length === 0) {
      return;
    }
    
    // 查找每个入边对应的源节点
    const parentNodes = incomingEdges.flatMap(edge => {
      const sourceNode = graph.nodes.find(
        node => node.id === edge.sourceNodeId
      );
      return sourceNode ? [sourceNode] : [];
    });
    
    // 如果找到父节点，则添加到结果数组并继续递归
    if (parentNodes.length > 0) {
      upstreamNodes.push(...parentNodes);
      parentNodes.forEach(node => findUpstream(node));
    }
  }
  
  // 从起始节点开始递归查找
  findUpstream(startNode);
  return upstreamNodes;
  // 对结果进行去重处理并返回
  // return uniqueBy(upstreamNodes, "id");
}    